package com.coolingme.Stream;

import java.io.*;

/**
 * 文件复制
 *
 * @author wangyue
 * @date 2019/4/1 15:58
 */
public class FileCopy {

    public static void main(String[] args) {
        FileCopy fileCopy = new FileCopy();

        // 原文件
        File file = new File("D://Java//IntelliJIDEA//workspace//java-learn//IO//file//fileStream//outStream.txt");
        File file2 = new File("D://Java//IntelliJIDEA//workspace//java-learn//IO//file//fileStream//3180.jpg");
        File file3 = new File("C://log//generator");
        File file4 = new File("D://MyLife//视频素材//log//generator");

//        System.out.println(file4)

        // 需要复制的路径
        String path = "D://Java//IntelliJIDEA//workspace//java-learn//IO//file//fileStream//copy";
        String path2 = "D://Java//IntelliJIDEA//workspace//java-learn//IO//file//fileStream//encrypt";
        String path3 = "D://MyLife//视频素材";
//        fileCopy.copyFile(file2, path);

//        System.out.println(file3.listFiles());
//        System.out.println(file.listFiles());

        fileCopy.copyAllFile(file3, path3);
    }

    /**
     * File复制，若File对象为文件夹，则递归复制
     *
     * @param file 需要复制的Fileduix
     * @param path 需要复制的目标路径
     */
    public void copyAllFile(File file, String path) {
        String oldPath = file.getAbsolutePath();//需要复制文件的绝对路径
        String newPath = path + oldPath.split(":")[1];// 根据文件名和路径名 拼出复制后的文件名
        File newFile = new File(newPath);// 创建新路径的File对象

        File[] fileList = file.listFiles();//判断需要复制的File对象是文件还是文件夹
        if (fileList != null) {//File对象为文件夹
            System.out.println("复制文件夹:" + newFile.getName());
            System.out.println(newFile.getAbsolutePath());
            boolean b = newFile.mkdirs();//创建新的文件夹
            System.out.println(b);
            if (fileList.length != 0) {//文件夹中还有文件(夹)
                for (File f : fileList) {
                    copyAllFile(f, path);//递归复制
                }
            }
        } else {//File对象为文件
            copyFile(file, newFile);
        }
    }

    /**
     * 文件复制
     *
     * @param file    原文件
     * @param newFile 新文件(目标文件)
     */
    public void copyFile(File file, File newFile) {
        System.out.println("复制文件:" + newFile.getName());
//            copyFile(file, newPath);//文件复制

        FileInputStream in = null;// 输入流
        FileOutputStream out = null;//输出流

        try {
            in = new FileInputStream(file);
            out = new FileOutputStream(newFile);

            byte[] b = new byte[1024];//小推车
            int count = in.read(b);//读
            while (count != -1) {//循环读写
                out.write(b);//写
                out.flush();//刷新
                count = in.read(b);//读
            }
            System.out.println(newFile.getName() + "复制完成！");

            try {
                if (in != null) {
                    in.close();//关闭输入流
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                if (out != null) {
                    out.close();//关闭输出流
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 文件复制
     *
     * @param file 原文件
     * @param path 需要复制的路径
     */
    public void copyFile(File file, String path) {
        FileInputStream in = null;//输入流
        FileOutputStream out = null;//输出流

        try {
            in = new FileInputStream(file);

            /*
            根据路径和原文件名称 创建一个新文件
            File.separator 根据系统自动添加文件分隔符
             */
            File newFile = new File(path + File.separator + file.getName());
            out = new FileOutputStream(newFile);

            // 读取原文件的信息
            byte[] b = new byte[1024];// 小推车:通常创建的字节数组  1kb-8kb
            int count = in.read(b); // count为读取到的有效字节数

            // 循环读取原文件，写入新文件
            while (count != -1) {
                /*
                文件加密，在此做一些变化
                除了记事本，其他格式打开会报错
                 */
//                b = encrypt(b);

                out.write(b, 0, count);// 截取有效的读取字节数
                out.flush();//刷新
                count = in.read(b);//重新读取
            }
            System.out.println(file.getName() + "复制完成");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 为了程序的健壮性，分开关闭
            // 关闭输入流
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            // 关闭输出流
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    /**
     * 文件加密，变换 文件传输中 小推车的顺序
     *
     * @param b 读取的字节数组
     * @return 变换后的字节数组
     */
    public byte[] encrypt(byte[] b) {
        byte temp = b[0];//临时变量
        b[1] = b[0];
        b[0] = temp;
        return b;
    }

}
